package collection_util

type Set[T int | int8 | int16 | int32 | int64 | float32 | float64 | bool | string] struct {
	set map[T]int8
}

func NewSet[T int | int8 | int16 | int32 | int64 | float32 | float64 | bool | string]() *Set[T] {
	set := Set[T]{
		set: make(map[T]int8),
	}
	return &set
}

func (s *Set[T]) Add(v T) {
	s.set[v] = 0
}

func (s *Set[T]) Delete(v T) {
	delete(s.set, v)
}

func (s *Set[T]) Contains(v T) bool {
	_, ok := s.set[v]
	return ok
}

func (s *Set[T]) ToSlice() []T {
	res := make([]T, 0, len(s.set))
	for k, _ := range s.set {
		res = append(res, k)
	}
	return res
}
